
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <!-- <script src="lib/canteen.js"></script> -->
        <!-- <script src="lib/draggable.js"></script> -->
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
            html {
                /* Fix the line-height to integer to avoid it varying across clients and
                   causing visual test failures. Some clients may not support fractional px. */
                line-height: 18px;
            }
        </style>


        <div id="main_roam"></div>


        <script>
            require([
                'echarts',
                './data/flare.json'
            ], function (echarts, data) {

                var _ctx = {
                    center: null
                };

                var option = {
                    backgroundColor: '#eef',

                    tooltip: {
                        trigger: 'item',
                        triggerOn: 'mousemove'
                    },

                    series:[
                        {
                            type: 'tree',
                            id: 'tree0',
                            // animation: false,

                            data: [data],

                            top: '18%',
                            bottom: '14%',

                            roam: true,
                            // roam: 'scale',
                            // roam: 'move',

                            layout: 'radial',
                            // layout: 'orthogonal',
                            symbol: 'emptyCircle',
                            // label: {show: false},

                            symbolSize: 7,
                            initialTreeDepth: 3,
                            animationDurationUpdate: 750
                        }
                    ]
                };

                function makeRectIndicators(option) {
                    var graphicOption = option.graphic = option.graphic || {};
                    graphicElsOption = graphicOption.elements = graphicOption.elements || [];
                    graphicElsOption.push({
                        id: 'view_rect_indicator',
                        type: 'rect',
                        silent: true,
                        z: -9,
                        style: {
                            // fill: '#e0e0e0',
                            fill: 'none',
                            stroke: '#999',
                            lineWidth: 1,
                            lineDash: 'dashed',
                        },
                        textContent: {
                            type: 'text',
                            style: {
                                text: 'view rect',
                                fill: '#555',
                                fontSize: 11,
                            },
                        },
                        textConfig: {
                            position: 'insideTopRight'
                        }
                    }, {
                        id: 'content_rect_indicator',
                        type: 'rect',
                        silent: true,
                        z: -10,
                        style: {
                            // fill: 'rgba(150,100,50,0.3)',
                            fill: 'none',
                            stroke: '#999',
                            lineWidth: 1,
                            lineDash: 'dashed',
                        },
                        textContent: {
                            type: 'text',
                            style: {
                                text: 'content bounding rect',
                                fill: '#555',
                                fontSize: 11,
                            },
                        },
                        textConfig: {
                            position: 'insideTopRight'
                        }
                    });

                    var gridOptions = option.grid = option.grid || [];
                    if (!Array.isArray(gridOptions)) {
                        gridOptions = option.grid = [option.grid];
                    }
                    gridOptions.push({
                        id: 'viewport_indicator',
                        show: true,
                        // Using `grid` as a indicator is a tricky way - should no bounding rect,
                        // otherwise it affect the trigger of geo roam due to `onIrrelevantElement`.
                        backgroundColor: '#eee',
                        silent: false,
                        ..._ctx.layoutParams,
                        borderColor: '#aaa',
                        borderType: 'dashed',
                        z: -100,
                    });
                }
                makeRectIndicators(option);

                function renderIndicatorRect() {
                    if (!chart) {
                        return;
                    }
                    // [CAVEAT] Internal data structure, probably change, do not use it outside.
                    // const queryParam = {mainType: 'series', query: {seriesId: _ctx.seriesMapId}};
                    // const viewCoordSys = chart.getModel().findComponents(queryParam)[0].coordinateSystem;
                    // const contentBoundingRect = viewCoordSys.getBoundingRect().clone();
                    // const trans = viewCoordSys.getComputedTransform();
                    // if (trans) {
                    //     contentBoundingRect.applyTransform(trans);
                    // }
                    // chart.setOption({
                    //     grid: {
                    //         id: 'viewport_indicator',
                    //         ..._ctx.layoutParams,
                    //     },
                    //     graphic: {
                    //         elements: [{
                    //             id: 'content_rect_indicator',
                    //             shape: contentBoundingRect,
                    //         }]
                    //     },
                    // });
                }

                var chart = testHelper.create(echarts, 'main_roam', {
                    title: [
                        'tree roam and layout'
                    ],
                    option: option,
                    inputsStyle: 'compact',
                    inputs: [
                        {
                            type: 'select',
                            text: 'box layout:',
                            values: [
                                'do_nothing',
                                {
                                    left: 50, top: 80, right: '20%', bottom: 20,
                                },
                                {
                                    left: null, top: null, right: null, bottom: null,
                                },
                                {
                                    left: 30, top: 30, right: null, bottom: '50%',
                                },
                            ],
                            onchange: function () {
                                var layoutParams = this.value;
                                if (layoutParams == 'do_nothing') {
                                    return;
                                }
                                chart.setOption({
                                    series: {
                                        id: 'tree0',
                                        ...layoutParams,
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            type: 'select',
                            text: 'layout:',
                            values: ['radial', 'orthogonal'],
                            onchange: function () {
                                chart.setOption({
                                    series: {
                                        id: 'tree0',
                                        layout: this.value,
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            type: 'select',
                            text: 'roam:',
                            values: [true, 'scale', 'move'],
                            onchange() {
                                chart.setOption({
                                    series: {
                                        id: 'tree0',
                                        roam: this.value,
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            type: 'select',
                            text: 'roamTrigger:',
                            values: ['global', undefined],
                            onchange() {
                                chart.setOption({
                                    series: {
                                        id: 'tree0',
                                        roamTrigger: this.value,
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            text: 'zoom:',
                            type: 'select',
                            values: [undefined, 0.5, 1, 5],
                            onchange() {
                                chart.setOption({
                                    series: {
                                        id: 'tree0',
                                        zoom: this.value,
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            type: 'select',
                            text: 'specify center:',
                            values: [false, true],
                            onchange() {
                                chart.__testHelper.switchGroup(
                                    this.value ? 'group_use_center' : 'group_no_center'
                                )
                                if (this.value) {
                                    _ctx.center = _ctx.center || ['50%', '50%'];
                                }
                                else {
                                    _ctx.center = null;
                                }
                                chart.setOption({
                                    series: {
                                        id: 'graph0',
                                        center: _ctx.center
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            type: 'select',
                            text: 'label.show:',
                            values: [true, false],
                            onchange() {
                                chart.setOption({
                                    series: {
                                        id: 'tree0',
                                        label: {show: this.value},
                                    }
                                });
                                renderIndicatorRect();
                            }
                        },
                        {
                            type: 'br',
                        },
                        {
                            type: 'groupset',
                            inputsHeight: 40,
                            groups: [{
                                id: 'group_no_center',
                                text: 'no center',
                            }, {
                                id: 'group_use_center',
                                text: 'specify center',
                                inputs: [
                                    ...[0, 1].map(centerIdx => ({
                                        type: 'select',
                                        text: `center[${centerIdx}]:`,
                                        options: [
                                            {
                                                id: 'percent',
                                                text: 'percent',
                                                input: {type: 'range', min: -50, max: 150, value: 50, suffix: '%'}
                                            },
                                            {
                                                id: 'absolute',
                                                text: 'absolute',
                                                input: {type: 'range', min: -100, max: 800, value: 100}
                                            },
                                        ],
                                        onchange() {
                                            if (this.optionId === 'absolute') {
                                                _ctx.center[centerIdx] = this.value;
                                            }
                                            else if (this.optionId === 'percent') {
                                                _ctx.center[centerIdx] = this.value + '%';
                                            }
                                            chart.setOption({
                                                series: {
                                                    id: 'tree0',
                                                    center: _ctx.center
                                                }
                                            });
                                            renderIndicatorRect();
                                        }
                                    }))
                                ]
                            }]
                        }, // End of groupset
                    ] // End of inputs
                }); // End of testHelper.create

                if (chart) {
                    chart.on('treeRoam', e => {
                        renderIndicatorRect();
                    });
                }

            });
        </script>

    </body>
</html>